package com.wxj.bank.storage.service;

import com.wxj.bank.module.modle.criteria.OrderBy;
import com.wxj.bank.module.modle.criteria.Where;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

public interface IMongoService {

    /* 添加 */

    /**
     * 添加
     * @param obj
     */
    void insert(Object obj,String collectionName);

    /**
     * 添加集合
     * @param objs
     */
    void insertAll(Collection<? extends Object> objs,String collectionName);

    /* 删除 */

    /**
     * 删除
     * @param obj
     * @param collectionName
     * @return
     */
    boolean delete(Object obj,String collectionName);

    /**
     * 批量删除
     * @param query
     * @param collectionName
     * @return
     */
    long delete(Query query,String collectionName);

    /* 修改 */

    /**
     * 修改
     * @param obj
     * @param collectionName
     */
    void update(Object obj,String collectionName);

    /**
     * 批量修改
     * @param objs
     * @param collectionName
     */
    void updateMulti(Collection<? extends Object> objs,String collectionName);

    /**
     * 批量条件修改
     * @param query
     * @param update
     * @param collectionName
     * @return
     */
    long updateMulti(Query query, Update update,String collectionName);

    /**
     * 批量修改
     * @param wheres
     * @param update
     * @param collectionName
     * @return
     */
    long updateMulti(Where[] wheres, Update update,String collectionName);

    /* 查询 */

    /**
     * 查询数量
     * @param wheres
     * @param collectionName
     * @return
     */
    long count(Where[] wheres,String collectionName);

    /**
     * 查询数量
     * @param query
     * @param collectionName
     * @return
     */
    long count(Query query,String collectionName);

    /**
     * 根据Id查询
     * @param tClass
     * @param collectionName
     * @param <T>
     * @return
     */
    <T> T findById(String id,Class<T> tClass,String collectionName);

    /**
     * 条件查询集合
     * @param tClass
     * @param collectionName
     * @param <T>
     * @return
     */
    <T> List<T> findAll(Class<T> tClass,String collectionName);

    /**
     * 条件查询集合
     * @param wheres
     * @param orders
     * @param skip
     * @param limit
     * @param tClass
     * @param collectionName
     * @param <T>
     * @return
     */
    <T> List<T> find(Where[] wheres,OrderBy[] orders, int skip,int limit, Class<T> tClass,String collectionName);

    /**
     * 聚合查询
     * @param aggregation
     * @param collectionName
     * @param tClass
     * @param <T>
     * @return
     */
    <T> List<T> aggregate(Aggregation aggregation,String collectionName,Class<T> tClass);

    /**
     * map-reduce计算
     * @param collectionName
     * @param map
     * @param reduce
     * @param tClass
     * @param <T>
     * @return
     */
    <T> List<T> mapReduce(String collectionName,String map,String reduce,Class<T> tClass);
}
